/*
  这个文件主要用于标学官网项目接口缓存
  1、缓存时间 - 5分钟
  2、缓存最大条数 - 500
  3、同一个请求 - 请求地址+参数完全一致
  4、同一个请求，
 */
import LRU from 'lru-cache' //缓存接口
import axios from './http.js'
import { appendQuery, getBuildEnv } from './utils.js'

//目前缓存的接口有：
const apiList = []

//配置缓存的时长和数量
const options = {
  max: 500,
  maxAge: 1000 * 60 * 5
}

const cache = new LRU(options)

cache.apiList = apiList

//重写axios的get请求，主要是在axios的get请求上加一层拦截，用于服务端缓存，如果有缓存就直接读取缓存中的
let get = axios.get

axios.get = function(...args) {
  //只缓存生产的接口
  let { isCpOrProd } = getBuildEnv()
  if (!isCpOrProd) return get(...args)

  let [url, params] = args

  //如果不在缓存列表的接口，不缓存，直接发起请求
  if (!apiList.includes(url)) return get(...args)

  //如果在缓存列表中
  let key = url
  //如果有参数，则key是url+参数的字符串，主要是区分同一接口不同参数的情况，应该是不同的key
  if (params && params.params) key = appendQuery(url, params.params)

  //判断当前处理的key是否已经被缓存了，如果是，则读取获取缓存数据，如果不是，则请求真正的数据
  let getCache = cache.get(key)
  if (getCache) {
    return Promise.resolve(getCache)
  } else {
    return get(...args).then(res => cacheRes(key, res))
  }
}

//缓存接口数据
function cacheRes(key, value) {
  cache.set(key, value)
  return Promise.resolve(value)
}

export default cache
